#ifndef TINY_GC_H
#define TINY_GC_H
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include"stack.h"
#include"hash.h"
#include"vm.h"
#include"secd.h"


#define GC_RUN_SIZE 10240

tiny_value *new_value(struct SecdVm *vm,enum tiny_type t);
tiny_value *gc_make_integer(struct SecdVm *vm,int i);
tiny_value *gc_make_double(struct SecdVm *vm,double v);
tiny_value *gc_make_bool(struct SecdVm *vm,int b);
tiny_value *gc_make_string(struct SecdVm *vm,char* s);
tiny_value *gc_make_char(struct SecdVm *vm,char c);
tiny_value *gc_make_list(struct SecdVm *vm,tiny_value *list);
tiny_value *gc_make_empty_list(struct SecdVm *vm);
tiny_value *gc_make_lambda(struct SecdVm *vm);
tiny_value *gc_make_func(struct SecdVm *vm,  c_func func);

void free_value(struct SecdVm *vm,tiny_value *val);
void mark_all(struct SecdVm *vm);
void mark_dump(tiny_secd_dump *d);
void mark_env(tiny_secd_env *val);
void mark_value(tiny_value *val);
void sweep(struct SecdVm *vm);
void mark(tiny_value *val);

#define marked(v) (v->mark==1)


#endif